package cn.edu.wynu;

import java.util.Random;
import java.util.Scanner;

public class Test10 {
    public static void main(String[] args) {
        // 案例十：模拟双色球：业务分析、用户投注一组号码
        // 双色球业务介绍：投注号码由6个红色球号码和1个蓝色球号码组成。
        // 红色球号码从1-33中选择;蓝色球号码从1-16中选择。

        // 创建用户输入的7个号码，并返回用户输入的7个号码
        System.out.println("欢迎使用双色球模拟投注系统！");
        int[] userNumbers = userSelectNumbers();
        System.out.println("您投注的7个号码是：");
        printArray(userNumbers);

        // 输出系统生成的7个中奖号码
        int[] luckyNumbers = createLuckyNumbers();
        System.out.println("系统生成的7个中奖号码是：");
        printArray(luckyNumbers);

        jugdge(userNumbers, luckyNumbers);

    }

    // 4.打印数组内容方法
    public static void printArray(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++){
            System.out.print(i == arr.length - 1 ? arr[i] : arr[i] + ", ");
        }
        System.out.println("]");
    }

    // 1.用于让用户投注一组号码(前6个是红球号码，最后1个是蓝球号码)。并返回用户投注的号码
    public static int[] userSelectNumbers() {
        // (1)创建一个整型数组，用来存储用户投注的7个号码
        int[] numbers = new int[7];
        // numbers = [0, 0, 0, 0, 0, 0, 0];

        Scanner sc = new Scanner(System.in);

        // (2)遍历前6个位置，让用户输入6个红球号码，并存入数组中
        for (int i = 0; i < numbers.length - 1; i++) {

            while (true) {
                // (3)让用户为当前位置投注一个红球号码(1-33之间，不能重复)
                System.out.println("请您输入第" + (i + 1) + "个红球号码（1~33之间，不能重复）：");
                int number = sc.nextInt();

                // (4)判断当前输入的号码是否合法，需要在1~33之间
                if (number < 1 || number > 33) {
                    System.out.println("您输入的红球号码不在1~33之间，请重新输入！");
                }else {
                    // (5)如何号码在1~33之间，判断这个号码是否重复，如果重复，则提示用户重新输入
                    if(exist(numbers, number)){
                        // number当前这个红球号码重复了
                        System.out.println("您输入的红球号码重复了，请重新输入！");
                    }else {
                        // number当前这个红球号码没有重复，可以正常存储
                        numbers[i] = number;
                        break; // 结束当次投注，跳出死循环
                    }
                }
            }
        }

        // (6)让用户为最后一个位置输入蓝球号码，并存入数组中
        while (true) {
            System.out.println("请您输入最后1个蓝球号码（1~16之间）：");
            int number = sc.nextInt();

            if (number < 1 || number > 16) {
                System.out.println("您输入的蓝球号码不在1~16之间，请重新输入！");
            }else {
                numbers[6] = number;
                break; // 蓝球号码存入成功，跳出死循环
            }
        }
        return numbers;
    }

    public static boolean exist(int[] numbers, int number) {
        // 要求我们判断number这个数字是否在numbers数组中存在
        // numbers = [1, 2, 3, 4, 2, 6, 7];
        // number = 2;
        // 遍历numbers数组，判断number是否在数组中存在
        for (int i = 0; i < numbers.length; i++) {
            if (numbers[i] == 0) {
                break; // 当前位置的数字为0，说明已经遍历到数组最后一个位置了
            }
            if(numbers[i] == number){
                return true;
            }
        }
        return false;
    }

    // 2.系统随机一组中奖号码(前6个是红球，最后1个是蓝球)，并返回这组中奖号码
    public static int[] createLuckyNumbers() {
        // (1)创建一个整型数组，用来存储中奖号码
        int[] numbers = new int[7];

        Random r = new Random();

        // (2)遍历前6个位置，让系统随机生成6个红球号码，并存入数组中(1-33之间，不能重复)
        for (int i = 0; i < numbers.length - 1; i++) {
            // i = 0, 1, 2, 3, 4, 5

            while (true) {
                // (3)为当前位置生成一个红球号码。(1~34之间，(0,32)+1 )
                int number = r.nextInt(33) + 1;

                // (4)判断当前生成的红球号码是否重复，如果重复，则重新生成一个红球号码，直到不重复为止
                if(!exist(numbers, number)){
                    // number这个红球号码重复了
                    // number这个红球号码没有重复，可以正常存入
                    numbers[i] = number;
                    break; // 跳出死循环
                }
            }
        }

        // (5)让系统为最后一个位置生成蓝球号码，并存入数组中(1-16之间)
        numbers[6] = r.nextInt(16) + 1;
        return numbers;
    }

    // 3.传入两组号码，用来判断用户投注号码的中奖情况，并输出。
    // 判断用户是否中奖，以及中奖情况
    public static void jugdge(int[] userNumber, int[] luckyNumber) {
        // userNumber = [1, 2, 3, 4, 5, 6, 7];
        // luckyNumber = [11, 12, 13, 14, 15, 16, 7];

        // (1)分别定义2个变量用于记住红球命中了几个以及蓝球命中几个
        int redCount = 0;
        int blueCount = 0;

        // 先判断红球命中数量
        // (2)遍历用户投注的前6个红球号码，判断红球是否命中
        for (int i = 0; i < userNumber.length - 1; i++) {
            // userNumber[i] = 1, 2, 3, 4, 5, 6
            // 开始遍历系统生成的6个随机红球中奖号码，判断当前红球号码是否命中
            for (int j = 0; j < luckyNumber.length - 1; j++) {
                if(userNumber[i] == luckyNumber[j]){
                    // 当前用户投注的号码和系统生成的号码命中，则红球命中+1
                    redCount++;
                    break; // 命中，跳出当前循环，继续判断下一个红球号码
                }
            }
        }
        // (3)判断用户投注的最后1个蓝球号码是否中奖
        blueCount = userNumber[6] == luckyNumber[6] ? 1 : 0;

        System.out.println("红球命中了" + redCount + "个，蓝球命中了" + blueCount + "个");

        // (4)判断中奖情况，并输出结果
        if(redCount == 6 && blueCount == 1){
            System.out.println("恭喜您，中奖1000万元！！！");
        }else if(redCount == 6 && blueCount == 0){
            System.out.println("恭喜您，中奖500万元！！");
        }else if (redCount == 5 && blueCount == 1){
            System.out.println("恭喜您，中奖3000元！");
        } else if (redCount == 5 && blueCount == 0 || redCount == 4 && blueCount == 1) {
            System.out.println("恭喜您，中奖200元！");
        } else if (redCount == 4 && blueCount == 0 || redCount == 3 && blueCount == 1) {
            System.out.println("恭喜您，中奖10元！");
        } else if (redCount < 3 && blueCount == 1) {
            System.out.println("恭喜您，中奖5元！");
        } else {
            System.out.println("很遗憾，您未中奖。");
        }
    }
}
